Code Reusability and Modularity: HOCs are particularly useful for when you want to modify a component and then use it in a bunch of places⁴. They allow you to make tiny batches of code to prevent overwhelming a component with too many options and props.
Cross-Cutting Concerns: HOCs are suitable for cross-cutting concerns and component composition³. They provide a way to reuse code when using ES6 classes.
Decorative Pattern: HOCs are similar to the decorator pattern, a function that takes a component as the first parameter and returns a new component¹. This is where you apply your cross-cutting functionality.
Composability: HOCs are composable. It's easy to nest them. You can apply multiple HOCs to one component by composing them.
Avoiding Naming Collisions: HOCs avoid method name clashing if two HOCs implement the same one.